package pe.com.ValoracionVivienda.service.impl;

import java.util.List;

import javax.persistence.TypedQuery;

import pe.com.ValoracionVivienda.domain.entities.Entrenamiento;
import pe.com.ValoracionVivienda.domain.entities.EntrenamientoItemEntrada;
import pe.com.ValoracionVivienda.domain.entities.EntrenamientoModelo;
import pe.com.ValoracionVivienda.service.interfaces.EntrenamientoService;

public class EntrenamientoServiceJpaImpl extends GenericServiceJpaImpl<Integer, Entrenamiento> 
	implements EntrenamientoService {

	public EntrenamientoServiceJpaImpl(){
		super();
	}

	@Override
	public List<Entrenamiento> getEntrenamientosActivosAutovaluo() {
		TypedQuery<Entrenamiento> query =
				em.createQuery("SELECT e FROM Entrenamiento e WHERE e.estado = :activo AND e.tipo = 0 ORDER BY e.fechaCreacion DESC", Entrenamiento.class);
		query.setParameter("activo", true);
		return query.getResultList();
	}

	@Override
	public List<Entrenamiento> getEntrenamientosActivosTasacionPorId(Integer id) {
		TypedQuery<Entrenamiento> query =
				em.createQuery("SELECT e FROM Entrenamiento e WHERE e.estado = :activo AND e.tipo = 1 AND e.tipoTasacion.id = :idTipoTasacion "
						+ "ORDER BY e.fechaCreacion DESC", Entrenamiento.class);
		query.setParameter("activo", true);
		query.setParameter("idTipoTasacion", id);
		return query.getResultList();
	}

	@Override
	public void cambiarEstado(Integer id, boolean estado) {
		Entrenamiento entrenamiento = em.find(Entrenamiento.class, id);
		entrenamiento.setEstado(estado);
		em.merge(entrenamiento);
	}

	@Override
	public List<Entrenamiento> getEntrenamientosPorIdTipoTasacion(Integer idTipoTasacion) {
		TypedQuery<Entrenamiento> query; 
		
		if (idTipoTasacion == null){
			query = em.createQuery("SELECT e FROM Entrenamiento e WHERE e.tipoTasacion IS NULL and e.estado = :activo ORDER BY e.fechaCreacion DESC", 
					Entrenamiento.class);
		} else {
			query = em.createQuery("SELECT e FROM Entrenamiento e WHERE e.tipoTasacion.id = :idTT and e.estado = :activo ORDER BY e.fechaCreacion DESC", 
					Entrenamiento.class);
			query.setParameter("idTT", idTipoTasacion);
		}
		
		query.setParameter("activo", true);
		return query.getResultList();
	}

	@Override
	public Entrenamiento getEntrenamientoEItemsEntradaPorId(Integer idEntrenamiento) {
		TypedQuery<Entrenamiento> query =
				em.createQuery("SELECT e FROM Entrenamiento e JOIN FETCH e.itemsCapaEntradaEntrenamiento items "
						+ "WHERE e.id = :idEntrenamiento ORDER BY items.orden", 
						Entrenamiento.class);
		query.setParameter("idEntrenamiento", idEntrenamiento);
		return query.getSingleResult();
	}

	@Override
	public List<EntrenamientoItemEntrada> getItemsEntradaPorEntrenamientoId(Integer idEntrenamiento) {
		TypedQuery<EntrenamientoItemEntrada> query =
				em.createQuery("SELECT item FROM EntrenamientoItemEntrada item WHERE item.entrenamiento.id = :idEntrenamiento "
						+ "ORDER BY item.orden", 
						EntrenamientoItemEntrada.class);
		query.setParameter("idEntrenamiento", idEntrenamiento);
		return query.getResultList();
	}

	@Override
	public EntrenamientoModelo getModeloPorEntrenamientoId(Integer idEntrenamiento) {
		TypedQuery<EntrenamientoModelo> query =
				em.createQuery("SELECT modelo FROM EntrenamientoModelo modelo WHERE modelo.entrenamiento.id = :idEntrenamiento ",
						EntrenamientoModelo.class);
		query.setParameter("idEntrenamiento", idEntrenamiento);
		return query.getSingleResult();
	}
}
